#include <iostream>
#include <vector>
#include <sstream>
#include <jsoncpp/json/json.h> // 注意需要包含头文件
#include <string>
std::string serialize()
{
    // 使用jsoncpp库进行多个对象的序列化

    // 1.将需要进行序列化的数据,存储在Json::Value对象中
    Json::Value root;
    root["姓名"] = "张三";
    root["年龄"] = 18;
    root["性别"] = "男";
    root["成绩"].append(98);
    root["成绩"].append(88);
    // 2.实例化使用一个StreamWriterBuilder工厂类对象

    Json::StreamWriterBuilder builder;
    // 3.通过StreamWriterBuilder对象的newStreamWriter()方法,创建一个StreamWriter对象

    Json::StreamWriter *writer = builder.newStreamWriter();
    // 4.通过StreamWriter对象的write()方法,将Json::Value对象序列化为字符串
    std::stringstream ss;
    int ret = writer->write(root, &ss);
    if (ret != 0)
    {
        std::cout << "json serialize error" << std::endl;
        return "";
    }

    std::cout << ss.str() << std::endl;
    delete writer;
    return ss.str();
    
}
void unserialize(const std::string &json_str)
{
    // 1.实例化一个CharReaderBuilder对象工厂类
    Json::CharReaderBuilder builder;
    
    //2.使用CharReaderBuilder对象的newCharReader()方法,创建一个CharReader对象
    Json::CharReader *reader = builder.newCharReader();
    // 3.定义Json::Value对象,用于存储反序列化后的数据
    Json::Value root;
 
    //4.使用CharReader对象的parse()方法,将json字符串解析为Json::Value对象

    // parse参数: 起始地址,结束地址,Json::Value对象,错误信息
    // 注意: 这里的json_str.c_str()是一个指针,指向字符串的首地址
    std::string err;
    bool ret = reader->parse(json_str.c_str(), json_str.c_str() + json_str.size(), &root, &err);
    if(ret == false){
        std::cout << "json unserialize error" << err << std::endl;
        return ;
    }
    // 5.逐个获取Json::Value对象的数据
    std::string name = root["姓名"].asString(); 
    std::cout<<"name:"<<name<<std::endl;
    std::cout<<"age:"<<root["年龄"].asInt()<<std::endl;
    std::cout<<"sex:"<<root["性别"].asString()<<std::endl;

    int sz = root["成绩"].size();
    for(int i = 0; i < sz; i++)
    {
        std::cout << "成绩" << i + 1 << ":" << root["成绩"][i].asInt() << std::endl;
    }
    delete reader;

}
int main()
{
    std::string str = serialize();
    unserialize(str);
    return 0;
}